package com.sfx.算法专题.位运算.A总结题型;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: sfx
 * Date: 2023-08-03
 * Time: 21:28
 */
public class A总结题型 {
    /**
     * 常见位运算操作 :
     *    1. 基础位运算
     *           &  有0则0
     *           |  有1则1
     *           ^ 相同为0,相异为1 / 无进位相加

     *    2. 给一个数n,确定它的二进制表示中的第x位是0还是1
     *         (n>>x) & 1

     *    3. 将一个数n的二进制表示的第x位修改成1
     *                                               x
     *                                 0 0 0 0 1 0 1 0 1 0 1 1 0
     *    我们只要或上这个数就可以了        0 0 0 0 0 0 0 1 0 0 0 0 0
     *    怎么得到那个数字呢 ? 我们只需要将1左移x位即可
     *         n |= (1 << x)
     *    你先想怎么才能得到他,然后呢,在去想怎么得到那个数字?

     *    4.  将一个数n的二进制表示的第x位修改成0
     *                                           x
     *                                 0 0 0 0 1 0 1 0 1 0 1 1 0
     *    我们只要与上这个数就可以了        1 1 1 1 1 1 0 1 1 1 1 1 1
     *    怎么得到那个数字呢 ? 我们需要  将1左移x位,然后在取反操作
     *    n = n & (~(1 << x))   <=>   n &= (~(1 << x))

     *    6. 提取一个数n 二进制表示中最右侧的1
     *     n & -n                ==> -n 就是把n全部取反之后再+1 也就是将最右侧的1,
     *     左边的区域全部取反,这样左边都是0了,右边本来也是0,所有就提取出最右侧的1了

     *    7. 干掉一个数n的二进制表示中最右侧的1
     *      n & (n-1)  ==> n-1的目的就是将n最右侧的1,的右边区域全部取反

     *    8. 异或操作
     *      a ^ 0 = a
     *      a ^ a = 0
     *      a ^ b ^ c = a ^(b ^ c)
     *   191,338,461,136,260
     */
}